home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
games
/
hexrev
/
hexrev.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-06-25
|
5KB
|
234 lines
/***************************************************
hexrev.c : 六角リバーシゲームだよ
Copyright (C) 1997 - 2000 by Makoto Hiroi
****************************************************/
#include "hexrev.h"
int first_move = TRUE; /* 人間側が先手(黒) */
int level = 1; /* レベル */
int play_flag; /* ゲーム中か */
/* 250 msec wait ルーチン */
void wait( void )
{
int start = clock();
while( (clock() - start) < 25 );
}
/* 終了 */
volatile void quit( void )
{
_iocs_crtmod( 16 );
_iocs_skey_mod( -1, 0, 0 ); /* ソフトウェアキーボード自動制御 */
_iocs_ms_curof();
_dos_c_fnkmod( 0 );
_dos_c_curon();
_dos_c_window( 0, 31 );
exit( 0 );
}
/* メッセージ */
typedef enum {
MOVE_COM, MOVE_HUMAN, BREAK, C_WIN, H_WIN, DRAW, THINK, PASS_M, NOT_PUT,
} MES_CODE;
const char *mes_table[] = {
"わたしの手番です",
"あなたの手番です",
"対局を中断します",
"私の勝ちです ",
"あなたの勝ちです",
"引き分けですね ",
"考えています・・",
"・・パスです・・",
"石は置けませんよ",
};
/* メッセージ出力 */
static void print_mes( int pos )
{
_dos_c_locate( 22, 28 );
printf( "%s", mes_table[pos] );
fflush( stdout );
wait();
wait();
}
/* 石を置く */
static int put_piece( int num, int piece )
{
char buffer[SIZE];
char *ptr = buffer;
int c = reverse_piece( num, piece, buffer );
if( c > 0 ){
draw_piece( num, piece );
wait();
while( *ptr != -1 ){
draw_piece( *ptr++, piece );
wait();
}
}
return c;
}
/* マウス入力 */
static int input_mouse( int piece )
{
for(;;){
int pos, x, y;
while( _iocs_ms_ontm( 0, 0 ) == 0 ); /* 左ボタンが押されるまで待つ */
pos = _iocs_ms_curgt();
while( _iocs_ms_offtm( 0, 0 ) == 0 ); /* ボタンが離されるのを待つ */
x = pos >> 16; y = pos & 0xffff;
if( (piece < FREE) &&
(x >= 48 && x < 466) && (y >= 48 && y < 466) ){
/* 駒を置く */
int n = get_postion( x, y );
if( n == -1 || put_piece( n, piece ) <= 0 ){
/* その場所には置けません */
print_mes( NOT_PUT );
} else {
return n;
}
} else if( y >= 480 ){ /* ステータスライン */
x = x / 64;
switch( x - 4 ){
case 0: /* レベルの変更 */
if( ++level > 5 ) level = 1;
print_level();
break;
case 1: /* 先手・後手の変更 */
if( play_flag == FALSE ){
first_move = (first_move ? FALSE : TRUE);
print_move();
}
break;
case 2: /* 対局 */
return START;
case 3: /* 終了 */
quit(); break;
}
}
}
}
/* ゲームの実行 */
static void play( void )
{
int turn, move, human_piece, com_piece, value;
if( first_move ){
turn = HUMAN;
human_piece = BLACK; com_piece = WHITE;
} else {
turn = COM;
human_piece = WHITE; com_piece = BLACK;
}
for(;;){
if( turn == HUMAN ){
/* 人間側の指し手 */
print_mes( MOVE_HUMAN );
if( !check_move( human_piece ) ){
if( check_move( com_piece ) ){
/* パスです */
print_mes( PASS_M );
} else {
/* 終了です */
value = result_value( TRUE );
break;
}
} else {
if( (move = input_mouse( human_piece )) == START ){
/* 中断です */
print_mes( BREAK );
value = NO_VALUE;
break;
}
}
turn = COM;
#ifdef 0
if( (move = select_move( human_piece, level )) == PASS ){
if( check_move( com_piece ) ){
/* パスだよ */
print_mes( PASS_M );
} else {
/* 終了です */
value = result_value( TRUE );
break;
}
} else {
put_piece( move, human_piece ); /* 駒を置くよ */
}
turn = COM;
#endif
} else {
/* コンピュータ側の指し手 */
print_mes( MOVE_COM );
if( (move = select_move( com_piece, level )) == PASS ){
if( check_move( human_piece ) ){
/* パスだよ */
print_mes( PASS_M );
} else {
/* 終了です */
value = result_value( TRUE );
break;
}
} else {
put_piece( move, com_piece ); /* 駒を置くよ */
}
turn = HUMAN;
}
print_stones();
/* 終了判定 */
if( (value = result_value( FALSE )) != NO_VALUE ){
break; /* 終了です */
}
}
if( value != NO_VALUE ){
if( value == 0 ){
print_mes( DRAW );
} else if( value > 0 ){
/* 黒の勝ち */
print_mes( (human_piece == BLACK ? H_WIN : C_WIN) );
} else {
/* 白の勝ち */
print_mes( (human_piece == WHITE ? H_WIN : C_WIN) );
}
}
}
/* 初期化 */
static void init_rev( void )
{
srand( time( NULL ) ); /* 乱数の初期化 */
init_screen(); /* 画面の初期化 */
init_data(); /* データの初期化 */
_dos_c_cls_al();
}
/* メインルーチン */
int main( int argc, char *argv[] )
{
init_rev();
for(;;){
/* 対局が押されるまで待つ */
while( input_mouse( FREE ) != START );
init_data();
play_flag = TRUE;
play(); /* ゲームの実行 */
play_flag = FALSE;
}
/* 終了は quit で行う */
return 0;
}
/* end of file */